package com.solidumgame.locroninja.juego
{
	import com.solidumgame.locroninja.juego.ingredientes.Ingrediente;
	import com.solidumgame.locroninja.juego.ingredientes.IngredienteCortado;
	import com.solidumgame.locroninja.juego.ingredientes.IngredienteNoCortado;
	import com.solidumgame.locroninja.juego.ingredientes.choclo.Choclo;
	
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.utils.Dictionary;
	
	import libs.away3d.events.MouseEvent3D;
	import libs.jiglib.collision.CollisionInfo;
	import libs.jiglib.physics.RigidBody;
	import libs.jiglib.plugin.away3d.Away3DPhysics;
	


	public class Partida extends Sprite
	{
		
		//Stage
		public static var stage:Stage;
		
		//Escenario
		public static var escenario:Escenario;
		
		//UI
		public static var ui:UI;
		
		//Fisica
		public static var fisica:Away3DPhysics;
		
		//Ingredientes
		public static var ingredientes:Array = new Array();
		public static var ingredientesCortados:Array = new Array();
		private static var generadorIngredientes:GeneradorIngredientes;
		
		//Olla
		public static var olla:Olla;
		
		//Variables de juego
		public static var velocidad:Number = 1;
		private static const gravedad:int = 10; 
		
	
		//Contadores de ingredientes
		protected var contadorIngredientes:int = 0;
		protected var contadorIngredientesCortadosNoValidos:int = 0;
		protected var contadorIngredientesCortadosValidos:int = 0;
		
		public function Partida(stage:Stage)
		{
			
			//Stage
			Partida.stage = stage;
			
			
			
			//Construimos escenario y lo agregamos a la pantalla
			escenario = new Escenario(stage.stageWidth/2, stage.stageHeight/2);			
			fisica = new Away3DPhysics(escenario,gravedad);
			Partida.fisica.createGround({width:400,height:200}, -240);
			addChild(escenario);
			
			//Agregamos la olla
			olla = new Olla();
			Partida.olla.agregarOlla();

			
			//Agregamos interfaz por encima del escenario
			ui = new UI();
			addChild(ui);
			
			//Creamos generador de ingredientes
			generadorIngredientes = new GeneradorIngredientes();
			
			//Listener de render
			addEventListener(Event.ENTER_FRAME, renderEscenario);
			
			
			
		}
		
		protected function renderEscenario(e:Event):void{
			
			/*(escenario.camera as HoverCamera3D).pan(stage.mouseX/stage.stageWidth*360);
			(escenario.camera as HoverCamera3D).tilt(stage.mouseY/stage.stageHeight*30);
			(escenario.camera as HoverCamera3D).hover();*/
			
			//Renderizamos y avanzamos en la fisica
			fisica.step();
			escenario.render();
			
			//Control de limites de ingrediente pasado
		
			ui.actualizarIngredientesNoCortados(ingredientes.length);
			
			for(var i:int = 0; i < ingredientes.length; i ++){
				
				if( ((ingredientes[i] as Ingrediente).modeloFisica.currentState.position.y <= (escenario.limiteVerticalIzquierdo-300)) || !((ingredientes[i] as IngredienteNoCortado).modeloFisica.isActive) ){
					
					/*
					if(((ingredientes[i] as Ingrediente).modeloFisica.currentState.position.y <= (escenario.limiteVerticalIzquierdo-300)))
						trace("Caido");
					*/
					
					(ingredientes[i] as IngredienteNoCortado).removerIngrediente(i);
					i--;
					if(i<0)
						i = 0;
				}
			}
			
			//Control de limite de ingrediente cortado pasado
			var eliminar:Boolean = false;

			for( i = 0; i < ingredientesCortados.length; i ++){
				
				eliminar = false;
				
				//Vemos si colisiona con el piso de la olla
				for(var j:int = 0; j < (ingredientesCortados[i] as IngredienteCortado).modeloFisica.collisions.length; j ++){
					if( (ingredientesCortados[i] as IngredienteCortado).modeloFisica.collisions[j].objInfo.body1.id == 1){
						eliminar = true;
						if((ingredientesCortados[i] as IngredienteCortado).valido)
							contadorIngredientesCortadosValidos++;
						else
							contadorIngredientesCortadosNoValidos++;
						ui.actualizarIngredientesCortadosValidos(contadorIngredientesCortadosValidos);
						ui.actualizarIngredientesCortadosNoValidos(contadorIngredientesCortadosNoValidos);
						break;
					}
					
				}
				
				if( ((ingredientesCortados[i] as IngredienteCortado).modeloFisica.currentState.position.y <= (escenario.limiteVerticalIzquierdo-300)) || eliminar || !((ingredientesCortados[i] as IngredienteCortado).modeloFisica.isActive)  ){
					(ingredientesCortados[i] as Ingrediente).removerIngrediente(i);
					i--;	
					if(i<0)
						i = 0;
				}
			}
			
		}
		
	}
}